AOP – Logging method execution time in Java with AspectJ
This is not a walk-thru. This is just an example AspectJ class.
Note: For logging, the log singleton which I previously posted is used, but of course you can hook this up to your own logging methods or just print to the console.
This class is intended to log when a method executes and when a method ends and include the time it took for a method to execute in nanoseconds. Methods inside methods are tabbed. This is an enhancement to this post: AOP – Logging all method calls and executions
package mainExample; import java.util.Stack; import org.aspectj.lang.JoinPoint; public aspect AspectLogMethodExecution { private int tabCount = 0; private Stack _StartTimeStack = new Stack(); pointcut AnyMethod() : (call(* *.*(..)) || execution(* *.*(..))) && !within(AspectLogMethodExecution) && !within(Log); before() : AnyMethod() { PrintMethod(thisJoinPointStaticPart); tabCount++; _StartTimeStack.add(System.nanoTime()); } after() : AnyMethod() { Long methodExecutionTime = EvaluateExecutionTime(); tabCount--; PrintMethod(thisJoinPointStaticPart, methodExecutionTime); } private Long EvaluateExecutionTime() { Long methodExecutionTime = System.nanoTime() - _StartTimeStack.pop(); return methodExecutionTime; } private void PrintMethod(JoinPoint.StaticPart inPart) { Log.WriteLine(GetTabs() + inPart); } private void PrintMethod(JoinPoint.StaticPart inPart, long inExecutionTime) { Log.WriteLine(GetTabs() + inPart + " Execution Time: " + inExecutionTime + " nanoseconds"); } private String GetTabs() { String tabs = ""; for (int i = 0; i < tabCount; i++) { tabs += "\t"; } return tabs; } }
So if you have a simple Hello, World app, this is the log output.
execution(void mainExample.Main.main(String[])) call(void java.io.PrintStream.println(String)) call(void java.io.PrintStream.println(String)) Execution Time: 112063 nanoseconds execution(void mainExample.Main.main(String[])) Execution Time: 904636 nanoseconds
I ran it multiple times and the executions times were sporadic. I remember reading somewhere that System.nanoTime() in java was not extremely accurate, but it is accurate enough for this example.
Return to Aspected Oriented Programming – Examples